﻿package org.rkuk.kasutil.designPatternTools 
{
	import flash.utils.getQualifiedClassName;
	/**
	 * 用于生成单例类，在重复创建单例时，抛出异常帮助检测错误。
	 * @author rkuk
	 */
	public class SingletonTool 
	{
		/**
		 * @private
		 */
		public function SingletonTool() 
		{
			AbstractTool.makeAbstractClass(this, SingletonTool);
		}
		
		/**
		 * 用于创建单例类.
		 * 在需要被定义为单例类的构造函数中加入此方法后，如果重复创建该类的实例，则抛出异常。
		 * @param	object			传入this
		 * @param	staticInstance	记录单例类实例的静态变量
		 * @throws	Error			如果重复创建该类的实例，则抛出异常。
		 * @example	如果要将MySingleton定义为单例类，则在MySingleton的构造函数中加入如下语句：
		 * <listing>
		 * makeSingleton(this,MySingleton.instance);	//instance是MySingleton的静态属性，用于记录所创建的对象
		 * MySingleton.instance = this;	//记录所创建的对象到静态属性instance中
		 * </listing>
		 */
		public static function makeSingleton(object:Object, staticInstance:Object,message:String=null):void
		{
			if (staticInstance != null)
			{
				if (message != null)
					throw new Error(message);
				else
				{
					var thisClass:String = getQualifiedClassName(object);
					var existClass:String = getQualifiedClassName(staticInstance);
					throw new Error("Can't create instance of singleton class \"" + existClass + 
						"\", because an object of \"" + thisClass + "\" has already been created");
				}
			}
		}
	}

}